package com.gbb.common.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Date;
import java.util.Locale;

import android.text.TextUtils;
import android.util.Log;

import com.gbb.common.chche.FileManager;

/**
 * 封装了Log工具类，当log级别为error的时候会写入到文件里面
 *
 * @author gaobingbing on 2013年12月17日 下午4:06:49
 */
@Deprecated
public class LogUtil {

    /** DEBUG级别日志开关 */
    private static final boolean SWITCH_DEBUG = true;

    /** INFO级别日志开关 */
    private static final boolean SWITCH_INFO = true;

    /** ERROR级别日志开关 */
    private static final boolean SWITCH_ERROR = true;

    /** 文件日志开关 */
    private static final boolean SWITCH_FILE = true;

    /** 可以修改log日志存放位置 */
    public static String logPath = FileManager.get().getAppDirPath() + "app.log";

    private static String customTag = "";

    /**
     * @return 日志打印的通用Tag
     */
    private static String generateTag() {
        if(TextUtils.isEmpty(customTag)) {
            StackTraceElement caller = Thread.currentThread().getStackTrace()[5];
            String callerClazzName = caller.getClassName();
            callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
            return String.format(Locale.getDefault(),"%s.%s(L:%d)",callerClazzName,caller.getMethodName(),caller.getLineNumber());
        }
        return customTag;
    }

    /**
     * debug级别的日志
     *
     * @param tag 日志标记
     * @param msg 日志信息
     */
    public static void debug(String tag,Object msg) {
        if(SWITCH_DEBUG) {
            customTag = tag;
            Log.d(generateTag(),msg == null ? "" : msg.toString());
        }
    }

    /**
     * debug级别的日志 Tag为通用Tag
     *
     * @param msg 日志信息
     */
    public static void debug(Object msg) {
        debug(null,msg);
    }

    /**
     * info级别的日志
     *
     * @param tag 日志标记
     * @param msg 日志信息
     */
    public static void info(String tag,Object msg) {
        if(SWITCH_INFO) {
            customTag = tag;
            Log.i(generateTag(),msg == null ? "" : msg.toString());
        }
    }

    /**
     * info级别的日志 Tag为通用Tag
     *
     * @param msg 日志信息
     */
    public static void info(Object msg) {
        info(null,msg);
    }

    /**
     * error级别的日志
     *
     * @param tag 日志标记
     * @param msg 日志信息
     */
    public static void error(String tag,Object msg) {
        if(SWITCH_ERROR) {
            customTag = tag;
            String finalTag = generateTag();
            Log.e(finalTag,msg == null ? "" : msg.toString());

            // 是否写成文件
            if(SWITCH_FILE) {
                writeLog(finalTag + "  " + msg);
            }
        }
    }

    /**
     * error级别的日志 Tag为通用Tag
     *
     * @param msg 日志信息
     */
    public static void error(Object msg) {
        error(null,msg);
    }

    /**
     * 将log信息写入到本地文件中
     *
     * @param msg 日志信息
     */
    public static void writeLog(String msg) {
        FileWriter fw = null;
        try {
            fw = new FileWriter(new File(logPath),true);
            fw.write((DateFormatUtil.getInstance().format(new Date(System.currentTimeMillis())) + "	" + msg + "\n"));
            fw.flush();
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fw != null) {
                    fw.close();
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将错误日志输入到文件中
     *
     * @param exception Exception
     */
    public static void writeLog(Throwable exception) {
        PrintStream ps = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(new File(logPath),true);
            ps = new PrintStream(fos,true,"utf-8");
            exception.printStackTrace(ps);
            exception.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(fos != null) {
                    fos.close();
                }
                if(ps != null) {
                    ps.close();
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

}
